/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.saber.certificacao.ejbs.stateless.interfaces;

import br.com.saber.certificacao.enums.Linguagem;
import br.com.saber.certificacao.enums.TipoProva;
import br.com.saber.certificacao.modelos.Prova;
import br.com.saber.certificacao.modelos.Usuario;
import br.com.saber.certificacao.modelos.Versao;
import br.com.saber.certificacao.modelos.relacionamentos.ProvaQuestao;
import java.util.List;
import java.util.Map;
import javax.ejb.Local;

/**
 *
 * @author gbvbahia
 */
@Local
public interface ProvaBeanLocal {

    /**
     * Busca provas do usuário por status terminada ou não terminada. 
     * @param usuario que criou a prova.
     * @param status true para provas terminadas e false para provas não terminadas.
     * @return Lista de provas com base no status.
     */
    List<Prova> buscarProvaPorStatus(Usuario usuario, boolean status);

    /**
     * Cria prova com base nas informações passadas.
     * Se não houver quantidades de Questões suficientes será lançada uma 
     * ProvaException.
     * @param tipoProva
     * @param aluno
     * @param quantidadeQuestoes
     * @param idiomaPreferido
     * @param versao
     * @param tipoProva
     * @return A Prova criada com base nas informações passadas
     */
    Prova criarProvaParaUsuario(Usuario aluno, int quantidadeQuestoes, Linguagem idiomaPreferido, Versao versao, TipoProva tipoProva);

    /**
     * Recebe uma prova que já exista no banco de dados e atualiza a mesma.
     * Deve ser utilizado para gravar as respostas marcadas e para
     * terminar a prova. Se a prova tiver acabada marque a variavel 
     * booleana da prova provaTerminada para true e o bean irá 
     * calcular a nota tirada na prova antes de salvar.
     * A prova com a nota é retornada pelo método para que você 
     * receba a nota.
     * @param prova a ser atualizada
     * @see criarProvaParaUsuario para criar uma nova prova.
     * @return prova com atualizações realizadas.
     */
    Prova atualizarProva(Prova prova);

    /**
     * Verifica se as respostas marcadas estão corretas
     * @param provaQuestao objeto que representa uma questão da prova.
     * @return verdadeiro se resposta correta, falso se estiver errada.
     */
    boolean isRespostaCorreta(ProvaQuestao provaQuestao);
    
    /**
     * Retorna um map com o Objetivo (String) e o percentual (Number) de erros
     * na prova.<br>
     * Forma de calculo:<br>
     * Total de erros de um objetivo / Total de erros da prova<br>
     * Se prova não estiver terminada irá retornar null
     * @param provaTerminada
     * @return Map&lt;String, Number&gt;
     */
    Map<String, Number> obterObjetivosProQuantidadeDeErros(Prova provaTerminada);
    
    /**
     * Retorna um map com o Objetivo (String) e a quantidade de questões erradas 
     * do referido objetivo, com a quantidade de questrões disponíveis do objetivo na prova<br>
     * Se prova não estiver terminada irá retornar null
     * @param provaTerminada
     * @return Map&lt;String, Integer[]&gt;
     */
    Map<String, Integer[]> obterObjetivosIncorretosComTotalQuestoesPorObjetivos(Prova provaTerminada);
}
